package com.yinxin.reflection;


import java.lang.annotation.*;
import java.lang.reflect.Field;

//练习反射操作注解
public class GetAnnotationInfo {
   public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
      Class stuClazz = Class.forName("com.yinxin.reflection.StudentX");
      //通过反射获取注解
      Annotation[] annotations = stuClazz.getAnnotations();
      for (Annotation annotation : annotations) {
         System.out.println(annotation);
      }
      //获得注解的value的值
      TableXin tableXin = (TableXin)stuClazz.getAnnotation(TableXin.class);
      String value = tableXin.value();
      System.out.println(value);
      //获得类指定的注解
      Field name = stuClazz.getDeclaredField("name");//先获取到这个类的某个属性
      FiledXin annotation = name.getAnnotation(FiledXin.class);//再获取这个属性的注解
      System.out.println(annotation.columnName());//输出这个类的这个属性上的注解的内容的值
      System.out.println(annotation.type());
      System.out.println(annotation.length());
   }
}
@TableXin("db_student")
class StudentX{
   @FiledXin(columnName = "db_id",type = "int",length = 10)
   private int id;
   @FiledXin(columnName = "db_age",type = "int",length = 10)
   private int age;
   @FiledXin(columnName = "db_name",type = "varchar",length = 3)
   private String name;
   public StudentX() {
   }
   public StudentX(int id, int age, String name) {
      this.id = id;
      this.age = age;
      this.name = name;
   }
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   @Override
   public String toString() {
      return "student{" +
              "id=" + id +
              ", age=" + age +
              ", name='" + name + '\'' +
              '}';
   }
}
//类名的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface TableXin{
   String value();
}
//属性的注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface FiledXin{
   String columnName();
   String type();
   int length();
}